【X68000(Z)アセンブラ講座 第006回 第004回のサンプルの詳細説明A】 2025/01/11   こんにちは☆ 今回はサンプルプログラムの詳細説明そのAです。 書き忘れていた部分などを書いていきます(^^; -------------------------------------------------------------------------------- 【 CG画面について 】 CG画面は1ピクセルあたり2byte(16ビット)のVRAM構造を使用し、 横1ラインのCG-VRAM空間は「1024×2 bytes(768x512px時)」です。 今回のスクリーンモード16(CGサイズ=1024x1024px))は4ビットカラー(16色)なので 1ピクセル16ビット中の下位4ビットが有効ビットですが 他の無効ビットにどんなビットデータを入れても無効ビットは無視されます。 -------------------------------------------------------------------------------- 【 スタック 】 サンプルプログラムの段階でスタックの説明を書くと アセンブラは難しいというイメージを与えてしまうと思って スタックの説明は意図的に今回の詳細説明に後回しする事にしていました。 では早速スタックの説明に入ります!! スタックとはOSコールの時のパラメータを格納したり レジスターの中身を一字的にバックアップとして格納したり 呼び出されたサブルーチン(サブプログラム)の中でレジスターをバックアップしたり サブルーチンをコールした後のリターン先アドレスを格納したりするバッファです。 スタックを操作するポインターはa7レジスターでa7の別名はSPです。 スタック領域はメインメモリー上に確保されていて 領域内の最後のメモリーが先頭で最初に向かって使われる仕組みです。 サンプルプログラムではスタックにデータを入れる事を「スタックに積む」と書きましたが 他に「スタックにPUSHする」と表現されている事も多いようです。 PUSHの逆の命令はPOPです。 [ 例01 ] OSコール .data str00: dc.b 'こんにちは!!',13,10,0 .even .text pea str00 * spから4を引き文字列データ先頭アドレス(4バイト)を(sp)に書き込む dc.w _PRINT * アドレス(sp)から始まる文字列をテキスト画面に書き込み表示する addq.l #4,sp * spを元のアドレスに戻す [ 例02 ] サブルーチン@ func01: move.l d0,-(sp) * d0をスタックに保存 * 画面をクリアして表示をオンにする moveq.l #_G_CLR_ON,d0 * 画面をクリアして表示をオンにする trap #15 move.l (sp)+,d0 * d0にスタックに保存した値を入れて元に戻す rts * 呼び出し元へリターン [ 例03 ] サブルーチンA func02: movem.l d0-d7/a0-a7,-(sp) * 複数のレジスターを1命令でスタックに保存 * 処理プログラム movem.l (sp)+,d0-d7/a0-a7 * 複数のレジスターを1命令でスタックから元に戻す rts 他のCPUで複数のレジスターを1命令でPUSHしたりPOPしたりできるのは 多分RISC-CPU(AndroidのARM系CPUなど)くらいでしょう。 -------------------------------------------------------------------------------- 【 Intel対策 】 Intel-CPUを採用したMSのBMP形式画像ファイルをX680x0(Z)で扱いたい方へ伝えたい事。 まず、32ビットデータの扱い方が違います。 68000MPUでは32ビットレジスターのデータをメモリーにコピーする時に レジスター内の上位バイトから下位バイトの順に(左から右へ)並んだとおりに メモリーへ自然に普通に転送しますが、 Intel-CPUはレジスターの内の下位バイトから上位バイトの順に つまり68000MPUとは逆順にメモリーにデータをメモリーに転送します。 16ビットアクセスの時も同じ事が言えます。 図で言うと、       68000MPU Intel-CPU レジスタ内 $11223344  $11223344        ↓↓     ↓↓ メモリー上 $11223344  $44332211 こんな感じです。 680x0MPUの転送方式を「ビッグエンディアン」、 Intel-CPUの転送方式を「リトルエンディアン」と呼びます。 (Intel以外にX68000ZやAndroidで採用されているARM系CPUもリトルエンディアンのはずでして、 この大問題を乗り越えてX68000Zのエミュレーターを完成させたZUIKIさんの技術者の方々は ものすごく大変な大仕事をしてくれたという事になるので 僕はZUIKIさんの技術者や技術者を支えていた各種スタッフの方々に とても感謝して大事にX68000Zを使っています。 もちろんWinPC用のX680x0エミュレーター製作者の方々にも感謝しています。) BMPファイルの他にもリトルエンディアンのファイル形式は沢山存在しているので リトルエンディアンのデータをビッグエンディアンに変換するサブルーチンを作ると良いでしょう。 -------------------------------------------------------------------------------- とりあえず今回で詳細説明は完了できたと思いますが、 まだ説明が抜けている部分がありましたらコメントでご連絡宜しくお願い致します。 また、間違いがありましたらご指摘下さい。 再度言わせて頂きますが、 書店やオークション等で68000MPU解説本やX68000のアセンブラ本などの重要な書籍を見付けたら 迷わずたくさんゲットして下さい。 アセンブリ言語の書籍は多いに越した事ありません!!!! 次回からスプライト画像の表示方法を説明する予定です☆ [ EOF ]